package com.it.travel.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * 定义aop实现访问时间统计的功能
 */
@Component
@Aspect//指定当前类为切面类
public class LogAop {
    //获取日志对象
    private static final Logger logger= LoggerFactory.getLogger(LogAop.class);
    //抽取切入点 ：统计旅游线路相关的以find开头的方法的耗时时间；
    @Pointcut("execution(public * com.it.travel.service.impl.RouteServiceImpl.find*(..))")
    public void pt(){}

    //定义环绕通知，实现统计切入点指定方法的耗时时间
    @Around("pt()")
    public Object logAdvice(ProceedingJoinPoint pjp){
        //获取方法的入参
        Object[] args = pjp.getArgs();
        //获取当前的方法名称
        Signature methodName = pjp.getSignature();
        //获取执行开始时间
        long startTime = System.currentTimeMillis();
        //指定调用的方法
        Object result = null;
        try {
            result = pjp.proceed(args);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        //获取执行结束时间
        long endTime = System.currentTimeMillis();
        //日志打印
        logger.info("执行方法：{}，入参：{}，执行时间：{}",methodName, Arrays.toString(args),endTime-startTime);
        return result;
    }
}
